// 引入数据库实例
const db = require("../utils/mysql.js");
// 引入参数验证模块
const v = require("../utils/verify");
const v2 = require("../utils/verify2")
// 引入查询工具函数
const doSql = require("../utils/doSql")
// 引入得到头像模块
const getImg = require("../utils/getHeadImg")
const doquery = doSql.query;
const doupdate = doSql.updata;

// 查询所有文章数量
exports.queryArticleCount = (req, res) => {
	new Promise((resolve, reject) => {
		const sql = `select count(*) as count from article where article.exist=1;`;
		// 注意：req 对象上的 user 属性，是 Token 解析成功，express-jwt 中间件帮我们挂载上去的
		db.query(sql, (err, results) => {
			// 1. 执行 SQL 语句失败
			if (err) {
				reject(err);
				return res.sd(err);
			}
			// 2. 执行 SQL 语句成功，但是查询到的数据条数少于0
			// console.log('#',results.length);
			if (results.length < 0) {
				reject("获取失败");
				return res.sd("获取失败！");
			}
			resolve(results);
			// 3. 将信息响应给客户端
			res.sd(results[0].count)

		});
	}).then((data) => {
		// console.log('#',data.length);
	}).catch(err => {
		console.log('#数据库错误===========>', err);
		res.sd("服务端错误！");

	});
};

// 查询所有赞的数量
exports.queryZanCount = (req, res) => {
	new Promise((resolve, reject) => {
		const sql = `select sum(zan) as zan from likes;`;
		// 注意：req 对象上的 user 属性，是 Token 解析成功，express-jwt 中间件帮我们挂载上去的
		db.query(sql, (err, results) => {
			// 1. 执行 SQL 语句失败
			if (err) {
				reject(err);
				return res.sd(err);
			}
			// 2. 执行 SQL 语句成功，但是查询到的数据条数少于0
			// console.log('#',results.length);
			if (results.length < 0) {
				reject("获取失败");
				return res.sd("获取失败！");
			}


			resolve(results);
			// 3. 将信息响应给客户端
			res.send({
				status: 0,
				data: results,
			});

		});
	}).then((data) => {
		// console.log('#',data.length);
	}).catch(err => {
		console.log('#数据库错误===========>', err);
		res.sd("服务端错误！");

	});
};

// 根据标签名查文章
// 根据赞的数量查询文章(文章页面展示)
exports.queryArticleByTag = async (req, res) => {
	if (v(req, ["tagName"], res) !== 0) {
		return;
	}
	const sql = `select likes.zan,tag_name tags, article.article_id, article.title, article.descr,article.createTime from tag,tag_art,article
		join likes on likes.article_id = article.article_id
		where article.article_id=tag_art.article_id
		and tag.tag_id=tag_art.tag_id
		and tag.tag_name=?
		and article.exist=1
		order by zan desc`;
	try {
		let result = await doquery(sql, [req.query.tagName]);
		res.send({
			status: 0,
			data: result,
		});
	} catch (err) {
		console.log(err);
		res.sd(err)
	}

};

// 根据赞的数量查询文章(文章页面展示)
exports.queryArticleByLike = (req, res) => {
	if (v(req, ["skip"], res) !== 0) {
		return;
	}
	let skip = 10 * (Number(req.query.skip) - 1);

	new Promise((resolve, reject) => {
		const sql = `SELECT likes.zan, article.article_id, article.title, article.descr,article.createTime, COALESCE(GROUP_CONCAT(tag.tag_name SEPARATOR ', '), '无') AS tags,SUM(likes.zan)as zan_count
		FROM article
		
		LEFT JOIN likes ON article.article_id = likes.article_id
		LEFT JOIN tag_art ON article.article_id = tag_art.article_id
		LEFT JOIN tag ON tag_art.tag_id = tag.tag_id
		where article.exist=1
		
		GROUP BY article.article_id
		ORDER BY zan_count desc
		limit 10 offset ?;`;
		// 注意：req 对象上的 user 属性，是 Token 解析成功，express-jwt 中间件帮我们挂载上去的
		db.query(sql, [skip], (err, results) => {
			// 1. 执行 SQL 语句失败
			if (err) {
				reject(err);
				return res.sd(err);
			}
			// 2. 执行 SQL 语句成功，但是查询到的数据条数少于0
			// console.log('#',results.length);
			if (results.length < 0) {
				reject("获取失败");
				return res.sd("获取失败！");
			}

			resolve(results);
			// 3. 将信息响应给客户端
			res.sd(results);

		});
	}).then((data) => {
		// console.log('#',data.length);
	}).catch(err => {
		console.log('#数据库错误===========>', err);
		res.sd("服务端错误！");

	});
};

// 查询最新文章
exports.queryArticleLatest = (req, res) => {
	new Promise((resolve, reject) => {
		const sql = `select article.article_id,article.createTime,article.title,user.user_id,user.username,user.touxiang from article,user where article.user_id=user.user_id order by createTime desc limit 6`;
		// 注意：req 对象上的 user 属性，是 Token 解析成功，express-jwt 中间件帮我们挂载上去的
		db.query(sql, (err, results) => {
			// 1. 执行 SQL 语句失败
			if (err) {
				reject(err);
				return res.sd(err);
			}
			// 2. 执行 SQL 语句成功，但是查询到的数据条数少于0
			// console.log('#',results.length);
			if (results.length < 0) {
				reject("获取失败");
				return res.sd("获取失败！");
			}


			resolve(results);
			// 3. 将信息响应给客户端
			res.send({
				status: 0,
				data: results,
			});

		});
	}).then((data) => {
		// console.log('#',data.length);
	}).catch(err => {
		console.log('#数据库错误===========>', err);
		res.sd("服务端错误！");

	});
};

// 搜索文章
exports.searchArt = (req, res) => {
	if (v(req, ["keyword"], res) !== 0) {
		return;
	}
	new Promise(async (resolve, reject) => {
		const sql = `SELECT article.article_id, article.title, article.descr, COALESCE(GROUP_CONCAT(tag.tag_name SEPARATOR ', '), '无') AS tags, article.createTime, article.descr, article.type
		FROM article
		LEFT JOIN tag_art ON article.article_id = tag_art.article_id
		LEFT JOIN tag ON tag_art.tag_id = tag.tag_id
		WHERE article.title LIKE ? OR article.contents LIKE ?
		GROUP BY article.article_id,article.title,article.descr,article.contents;`;
		// 注意：req 对象上的 user 属性，是 Token 解析成功，express-jwt 中间件帮我们挂载上去的
		let result = await doquery(sql, [`%${req.query.keyword}%`, `%${req.query.keyword}%`])

		// 3. 将信息响应给客户端
		res.send({
			status: 0,
			data: result,
		});
	}).then((data) => {
		// console.log('#',data.length);
	}).catch(err => {
		console.log('#数据库错误===========>', err);
		res.sd("服务端错误！");

	});
};

// 根据文章id查询文章消息信息
exports.queryArticleByID = (req, res) => {
	if (v(req, ["article_id"], res) !== 0) {
		return;
	}
	let article_id = req.query.article_id;
	console.log('#', article_id);
	new Promise((resolve, reject) => {
		const sql = `select * from article where article_id = ?`;
		// 注意：req 对象上的 user 属性，是 Token 解析成功，express-jwt 中间件帮我们挂载上去的
		db.query(sql, [article_id], (err, results) => {
			// 1. 执行 SQL 语句失败
			if (err) {
				reject(err);
				return res.sd(err);
			}
			// 2. 执行 SQL 语句成功，但是查询到的数据条数少于0
			// console.log('#',results.length);
			if (results.length < 0) {
				reject("获取失败");
				return res.sd("获取失败！");
			}


			resolve(results);
			// 3. 将信息响应给客户端
			res.send({
				status: 0,
				data: results,
			});

		});
	}).then((data) => {
		// console.log('#',data.length);
	}).catch(err => {
		console.log('#数据库错误===========>', err);
		res.sd("服务端错误！");
	});
};

// 赞数
exports.getArt_likes = (req, res) => {
	if (v(req, ["article_id"], res) !== 0) {
		return;
	}
	let article_id = req.query.article_id;
	new Promise((resolve, reject) => {
		const sql = `select zan from likes where article_id = ?`;
		// 注意：req 对象上的 user 属性，是 Token 解析成功，express-jwt 中间件帮我们挂载上去的
		db.query(sql, article_id, (err, results) => {
			// 1. 执行 SQL 语句失败
			if (err) {
				reject(err);
				return res.sd(err);
			}
			// 2. 执行 SQL 语句成功，但是查询到的数据条数少于0
			// console.log('#',results.length);
			if (results.length < 0) {
				reject("获取失败");
				return res.sd("获取失败！");
			}


			resolve(results);
			// 3. 将信息响应给客户端
			res.send({
				status: 0,
				data: results,
			});

		});
	}).then((data) => {
		// console.log('#',data.length);
	}).catch(err => {
		console.log('#数据库错误===========>', err);
		res.sd("服务端错误！");
	});
};

// 修改文章标题
exports.setTit = (req, res) => {
	if (v2(req, ["article_id", "title"], res) !== 0) {
		return;
	}
	let article_id = req.body.article_id;
	let title = req.body.title;
	new Promise((resolve, reject) => {
		const sql2 = `
UPDATE blogs.article t
SET t.title = ?
WHERE t.article_id = ?;
`;
		// 注意：req 对象上的 user 属性，是 Token 解析成功，express-jwt 中间件帮我们挂载上去的
		db.query(sql2,
			[
				title,
				article_id
			],
			(err, results) => {
				// 1. 执行 SQL 语句失败
				if (err) {
					return res.sd(err);
				}
				// 2. 执行 SQL 语句成功，但是查询到的数据条数少于0
				// console.log('#',results.length);
				if (results.affectedRows !== 1) {
					return res.sdErr("失败！");
				}

				// 3. 将信息响应给客户端
				res.sd("成功");

			});
	}).catch((err) => {
		res.sd(err);
	});
};

// 删除文章
exports.delArt = async (req, res) => {
	if (v2(req, ["article_id"], res) !== 0) {
		return;
	}
	let article_id = req.body.article_id;
	const sql = `
		UPDATE blogs.article t
		SET t.exist = '0'
		WHERE t.article_id = ?;
`;
	try {
		await doupdate(sql, [article_id])
		res.sd("OK");
	} catch (e) {
		res.sdErr(e);
	}

};
